package com.olivia.sdk.exception.entity;

import com.google.common.collect.ImmutableMap;
import com.olivia.sdk.utils.$;
import java.util.Map;

/**
 * SQL错误信息处理类 维护数据库错误代码与对应描述的映射关系，提供错误信息查询功能
 */
public final class SQLErrorMsg {

  /**
   * 数据库错误代码与描述的映射表 使用ImmutableMap确保映射关系不可变，线程安全且防止意外修改
   */
  private static final Map<Integer, String> SQL_ERROR_MSG_MAP = ImmutableMap.<Integer, String>builder()//
      // 标准MySQL错误码
      .put(1005, "创建表失败")//
      .put(1006, "创建数据库失败")//
      .put(1007, "数据库已存在，创建数据库失败")//
      .put(1008, "数据库不存在，删除数据库失败")//
      .put(1009, "不能删除数据库文件导致删除数据库失败")//
      .put(1010, "不能删除数据目录导致删除数据库失败")//
      .put(1011, "删除数据库文件失败")//
      .put(1012, "不能读取系统表中的记录")//
      .put(1020, "记录已被其他用户修改")//
      .put(1021, "硬盘剩余空间不足，请加大硬盘可用空间")//
      .put(1022, "关键字重复，更改记录失败")//
      .put(1023, "关闭时发生错误")//
      .put(1024, "读文件错误")//
      .put(1025, "更改名字时发生错误")//
      .put(1026, "写文件错误")//
      .put(1032, "记录不存在")//
      .put(1036, "数据表是只读的，不能对它进行修改")//
      .put(1037, "系统内存不足，请重启数据库或重启服务器")//
      .put(1038, "用于排序的内存不足，请增大排序缓冲区")//
      .put(1040, "已到达数据库的最大连接数，请加大数据库可用连接数")//
      .put(1041, "系统内存不足")//
      .put(1042, "无效的主机名")//
      .put(1043, "无效连接")//
      .put(1044, "当前用户没有访问数据库的权限")//
      .put(1045, "不能连接数据库，用户名或密码错误")//
      .put(1048, "字段不能为空")//
      .put(1049, "数据库不存在")//
      .put(1050, "数据表已存在")//
      .put(1051, "数据表不存在")//
      .put(1054, "字段不存在")//
      .put(1065, "无效的SQL语句，SQL语句为空")//
      .put(1081, "不能建立Socket连接")//
      .put(1114, "数据表已满，不能容纳任何记录")//
      .put(1116, "打开的数据表太多")//
      .put(1129, "数据库出现异常，请重启数据库")//
      .put(1130, "连接数据库失败，没有连接数据库的权限")//
      .put(1133, "数据库用户不存在")//
      .put(1141, "当前用户无权访问数据库")//
      .put(1142, "当前用户无权访问数据表")//
      .put(1143, "当前用户无权访问数据表中的字段")//
      .put(1146, "数据表不存在")//
      .put(1147, "未定义用户对数据表的访问权限")//
      .put(1149, "SQL语句语法错误")//
      .put(1158, "网络错误，出现读错误，请检查网络连接状况")//
      .put(1159, "网络错误，读超时，请检查网络连接状况")//
      .put(1160, "网络错误，出现写错误，请检查网络连接状况")//
      .put(1161, "网络错误，写超时，请检查网络连接状况")//
      .put(1062, "字段值重复，入库失败")//
      .put(1169, "字段值重复，更新记录失败")//
      .put(1177, "打开数据表失败")//
      .put(1180, "提交事务失败")//
      .put(1181, "回滚事务失败")//
      .put(1203, "当前用户和数据库建立的连接已到达数据库的最大连接数，请增大可用的数据库连接数或重启数据库")//
      .put(1205, "加锁超时")//
      .put(1211, "当前用户没有创建用户的权限")//
      .put(1216, "外键约束检查失败，更新子表记录失败")//
      .put(1217, "外键约束检查失败，删除或修改主表记录失败")//
      .put(1226, "当前用户使用的资源已超过所允许的资源，请重启数据库或重启服务器")//
      .put(1227, "权限不足，您无权进行此操作")//
      .put(1235, "MySQL版本过低，不具有本功能")//
      // 自定义错误码
      .put(16000, "数据分片入参有误")//
      .put(-1, "数据库执行失败,请联系管理员")//
      .build();

  /**
   * 私有构造函数，防止实例化工具类
   */
  private SQLErrorMsg() {
    throw new AssertionError("工具类不允许实例化");
  }

  /**
   * 根据错误代码获取对应的错误信息
   *
   * @param errCode 数据库错误代码
   * @return 错误描述信息，如果没有匹配的错误码则返回默认信息
   */
  public static String getErrMsg(Integer errCode) {
    // 使用Google Guava的Strings工具类处理空值，确保返回非空字符串
    String msg = SQL_ERROR_MSG_MAP.getOrDefault(errCode, null);
    return $.firstNotNull(msg, "数据库执行失败,请联系管理员");
  }
}
